//
//  LYQNetworkManager.swift
//  SwiftWeibo
//
//  Created by 刘英群 on 2017/1/4.
//  Copyright © 2017年 刘英群. All rights reserved.
//

// MARK: 封装AFN
import UIKit
//导入框架文件夹名字
import AFNetworking

//swift枚举支持任意数据类型
//switch,enum在OC中只支持整数
enum LYQHTTPMethod {
    
    case GET
    case POST
}

// 网络管理工具
class LYQNetworkManager: AFHTTPSessionManager {

    //静态区 / 常量区 / 闭包
    //在第一次访问时，执行闭包，并且将结果保存在shared常量中
    static let shared: LYQNetworkManager = {
       
        //实例化对象
        let instance = LYQNetworkManager()
        
        //设置响应反序列化支持的数据格式
        instance.responseSerializer.acceptableContentTypes?.insert("text/plain")
        
        //返回对象
        return instance
    }()
    
    // 用户账户的懒加载属性
    lazy var userAccount = LYQUserAccount()
    
    //用户登录标记（计算型属性）
    var userLogon: Bool {
        return userAccount.access_token != nil
    }
    
    // 专门负责拼接 token 的网络请求方法
    func tokenRequest(method: LYQHTTPMethod = .GET, URLString: String, parameters: [String: Any], completion: @escaping (Any?, Bool)->()){
        
        //处理 token 字典， 一般token不为nil
        guard let token = userAccount.access_token else {
            
            // FIXME: 发送通知，提示用户登录（本方法不知道谁被调用，谁接收到通知，谁处理）
            print("没有token，需要登录")
            //发送通知，提示用户再次登录（本方法不知道谁被调用，谁接收到通知，谁处理）
            NotificationCenter.default.post(name: NSNotification.Name(rawValue: LYQUserShouldLoginNotification), object: "bad token")
            completion(nil, false)
            return
        }
        // 1.判断参数字典是否存在，如果为nil，应该新建一个字典
        var parameters = parameters
        if parameters.isEmpty {
            
            //实例化字典
            parameters = [String: Any]()
        }
        // 2.设置参数字典，代码在此处字典一定有值
        parameters["access_token"] = token
        
        //调用request 发起真正的网络请求方法
        request(URLString: URLString, parameters: parameters, completion: completion)

    }
    
    
    /// 封装AFN 的GET / POST 请求
    ///
    /// - Parameters:
    ///   - method: GET / POST
    ///   - URLString: urlString
    ///   - parameters: 参数字典
    ///   - completion: 完成回调[responseObj(数组/字典)，是否成功]
    func request(method: LYQHTTPMethod = .GET, URLString: String, parameters: [String: Any], completion: @escaping (Any?, Bool)->()) {
        
        // 成功回调
        let success = { (task: URLSessionDataTask, responseObj: Any?) -> () in
            
            completion(responseObj, true)
        }
        
        // 失败回调
        let failure = { (task: URLSessionDataTask?, error: Error) -> () in
            
            // 针对403 处理用户token过期 父类往子类转，不能参与计算但能比较
            if (task?.response as? HTTPURLResponse)?.statusCode == 403 {
                print("Token 过期了")
                
                //发送通知，提示用户再次登录（本方法不知道谁被调用，谁接收到通知，谁处理）
                NotificationCenter.default.post(name: NSNotification.Name(rawValue: LYQUserShouldLoginNotification), object: "bad token")
            }
            
            // error通常比较多，一堆英文
            print("网络请求错误 \(error)")
            completion(nil, false)
        }
        
        if method == .GET {
            
            get(URLString, parameters: parameters, progress: nil, success: success, failure: failure)

          
        }else {
            
            post(URLString, parameters: parameters, progress: nil, success: success, failure: failure)
        }
    }
}
